package com.alameda.service.impl.tag;

import com.alameda.common.base.constant.SqlDmlConstant;
import com.alameda.common.exception.BusinessException;
import com.alameda.common.utils.ObjectUtils;
import com.alameda.common.utils.PubUtils;
import com.alameda.filestorage.business.service.FileStorageComponent;
import com.alameda.mapper.tag.AdTagMapper;
import com.alameda.pojo.tag.AdTagDO;
import com.alameda.service.media.AdMediaService;
import com.alameda.service.tag.AdTagService;
import com.alameda.tag.dto.AdTagDTO;
import com.alameda.tag.vo.AdTagVO;
import com.alameda.video.vo.ApVideoVO;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

import static com.alameda.common.base.constant.MediaConstant.SaveOrUpdateConstant.ONE;
import static com.alameda.common.base.constant.MediaConstant.SaveOrUpdateConstant.ZERO;

/**
 * 媒体文件标签 业务逻辑层 具体实现
 *
 * @author Lv
 * @date 2024/08/01
 */
@Slf4j
@Service
public class AdTagServiceImpl extends ServiceImpl<AdTagMapper, AdTagDO> implements AdTagService {

    @Autowired
    private AdTagMapper adTagMapper;

    /**
     * 查询媒体文件标签
     *
     * @param adTagDTO 媒体文件标签信息
     * @return
     */
    @Override
    public IPage<AdTagVO> loadTagInfo(AdTagDTO adTagDTO) {
        IPage<AdTagDO> page = new Page<>(adTagDTO.getPageNum(), adTagDTO.getPageSize());
        LambdaQueryWrapper<AdTagDO> lambdaQueryWrapper = getLambdaQueryWrapper(adTagDTO);
        IPage<AdTagDO> pageData = this.page(page, lambdaQueryWrapper);
        return ObjectUtils.convertPageData(pageData, AdTagVO.class);
    }

    /**
     * 获取条件构造
     *
     * @param adTagDTO 媒体文件标签信息
     * @return
     */
    private LambdaQueryWrapper<AdTagDO> getLambdaQueryWrapper(AdTagDTO adTagDTO) {
        return Wrappers.lambdaQuery(AdTagDO.class)
                .like(PubUtils.isNotEmpty(adTagDTO.getTagName()), AdTagDO::getTagName, adTagDTO.getTagName())
                .orderByDesc(AdTagDO::getCreateTime);
    }

    @Autowired
    private FileStorageComponent fileStorageComponent;

    /**
     * 保存或修改标签
     *
     * @param adTagDTO 媒体文件标签信息
     * @return
     */
    @Override
    public Boolean saveOrUpdateTag(AdTagDTO adTagDTO) {
        checkData(adTagDTO);
        // 上传封面
        String tagCoverUrl = PubUtils.isNotNull(adTagDTO.getTagCoverFile())
                ? fileStorageComponent.uploadFile(adTagDTO.getTagCoverFile())
                : adTagDTO.getTagCoverUrl();

        AdTagDO adTagDO = ObjectUtils.convert(adTagDTO, AdTagDO.class);
        adTagDO.setTagCoverUrl(tagCoverUrl);
        return this.saveOrUpdate(adTagDO);
    }

    /**
     * 校验数据
     *
     * @param adTagDTO 媒体文件标签信息
     */
    private void checkData(AdTagDTO adTagDTO) {
        // 通过判断新增 修改 获取判断值
        Long checkCount = PubUtils.isNotNull(adTagDTO.getId()) ? ONE : ZERO;
        Long count = this.count(AdTagDO.builder().tagName(adTagDTO.getTagName()).build());
        if (count > checkCount) {
            BusinessException.throwException("已存在同名标签");
        }
    }

    /**
     * 读取下拉列表
     *
     * @param adTagDTO 媒体文件标签信息
     * @return
     */
    @Override
    public List<AdTagVO> listTag(AdTagDTO adTagDTO) {
        LambdaQueryWrapper<AdTagDO> lambdaQueryWrapper = getLambdaQueryWrapper(adTagDTO);
        // 控制加载数据量
        lambdaQueryWrapper.last(SqlDmlConstant.LIMIT + adTagDTO.getLoadCount());

        List<AdTagDO> adTagDOList = this.list(lambdaQueryWrapper);
        return ObjectUtils.convertList(adTagDOList, AdTagVO.class);
    }

    @Autowired
    private AdMediaService adMediaService;

    /**
     * 通过标签查询视频列表
     *
     * @param adTagDTO 媒体文件标签信息
     * @return
     */
    @Override
    public List<ApVideoVO> loadMediaByTag(AdTagDTO adTagDTO) {
        return adMediaService.loadMediaByTag(adTagDTO);
    }

    /**
     * 通过媒体id读取标签信息
     *
     * @param mediaId 媒体id
     * @return
     */
    @Override
    public List<AdTagVO> findTagInfoByMediaId(Long mediaId) {
        List<AdTagDO> adTagDOList = adTagMapper.findTagInfoByMediaId(mediaId);
        return ObjectUtils.convertList(adTagDOList, AdTagVO.class);
    }
}
